package org.zetaframework.job.properties;

import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * 定时任务配置参数
 *
 * @author gcc
 */
@ConfigurationProperties(prefix = JobProperties.PREFIX)
public class JobProperties {
    public static final String PREFIX = "xxl.job";

    /** 调度中心配置 */
    private Admin admin = new Admin();

    /** 执行器配置 */
    private Executor executor = new Executor();


    /**
     * 调度中心配置类
     */
    public static class Admin {
        /**
         * 调度中心地址[选填]
         * <p>
         * 说明：
         * <pre>
         * 1.如调度中心集群部署存在多个地址则用逗号分隔。
         *   执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调"
         * 2.为空则关闭自动注册
         * </pre>
         */
        private String addresses;

        /**
         * 调度中心通讯TOKEN[选填]
         * <p>
         * 说明：
         * 非空时启用
         */
        private String accessToken;

        /**
         * 调度中心通讯超时时间[选填]
         * <p>
         * 说明：
         * <pre>
         * 1.单位秒
         * 2.默认3s
         * </pre>
         */
        private Integer timeout = 3;

        public String getAddresses() {
            return addresses;
        }

        public void setAddresses(String addresses) {
            this.addresses = addresses;
        }

        public String getAccessToken() {
            return accessToken;
        }

        public void setAccessToken(String accessToken) {
            this.accessToken = accessToken;
        }

        public Integer getTimeout() {
            return timeout;
        }

        public void setTimeout(Integer timeout) {
            this.timeout = timeout;
        }
    }

    /**
     * 执行器配置类
     */
    public static class Executor {
        /**
         * 执行器AppName[选填]
         * <p>
         * 说明：
         * <pre>
         * 1.如调度中心集群部署存在多个地址则用逗号分隔。
         *   执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调"
         * 2.为空则关闭自动注册
         * </pre>
         */
        private String appName;

        /**
         * 执行器注册地址[选填]
         * <p>
         * 说明：
         * <pre>
         * 1.优先使用该配置作为注册地址
         * 2.为空时使用内嵌服务 “IP:PORT” 作为注册地址。
         *   从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
         * </pre>
         */
        private String address;

        /**
         * 执行器IP[选填]
         * <p>
         * 说明：
         * <pre>
         * 1.默认为空表示自动获取IP
         * 2.多网卡时可手动设置指定IP，该IP不会绑定Host仅作为通讯使用
         * 3.地址信息用于 "执行器注册" 和 "调度中心请求并触发任务"
         * </pre>
         */
        private String ip;

        /**
         * 执行器端口[选填]
         * <p>
         * 说明：
         * <pre>
         * 1.小于等于0则自动获取
         * 2.默认端口为9999
         * 3.单机部署多个执行器时，注意要配置不同执行器端口
         * </pre>
         */
        private Integer port = 9999;

        /**
         * 执行器日志文件存储路径[选填]
         * <p>
         * 说明：
         * <pre>
         * 1.需要对该路径拥有读写权限
         * 2.为空则使用默认路径
         * </pre>
         */
        private String logPath;

        /**
         * 执行器日志文件保存天数[选填]
         * <p>
         * 说明：
         * <pre>
         * 1.过期日志自动清理, 限制值大于等于3时生效;
         * 2.否则, 如-1, 关闭自动清理功能
         * </pre>
         */
        private Integer logRetentionDays = 30;

        public String getAppName() {
            return appName;
        }

        public void setAppName(String appName) {
            this.appName = appName;
        }

        public String getAddress() {
            return address;
        }

        public void setAddress(String address) {
            this.address = address;
        }

        public String getIp() {
            return ip;
        }

        public void setIp(String ip) {
            this.ip = ip;
        }

        public Integer getPort() {
            return port;
        }

        public void setPort(Integer port) {
            this.port = port;
        }

        public String getLogPath() {
            return logPath;
        }

        public void setLogPath(String logPath) {
            this.logPath = logPath;
        }

        public Integer getLogRetentionDays() {
            return logRetentionDays;
        }

        public void setLogRetentionDays(Integer logRetentionDays) {
            this.logRetentionDays = logRetentionDays;
        }
    }

    public Admin getAdmin() {
        return admin;
    }

    public void setAdmin(Admin admin) {
        this.admin = admin;
    }

    public Executor getExecutor() {
        return executor;
    }

    public void setExecutor(Executor executor) {
        this.executor = executor;
    }
}
